unit Unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, TAGraph, TASeries, Forms, Controls, Graphics, Dialogs, StdCtrls , TALegend; type //Хранилище параметров движения TParametresOfFly = packed record a: array[1..5,1..5] of double; c: array[1..14] of double; e: array[1..3] of double; w0: double; alpha0: double; V0: double; H0: double; teta0: double; h: double; tt: double; end; TFormBase = class; TBorder = class; TController = class; TStorage = class; //Абстракнтый класс фармы TFormBase = class abstract (TForm) //Набор значений Ci StringGrid1: TStringGrid; //Набор значнеий Ei StringGrid2: TStringGrid; Label1: TLabel; //Время интегрировния Edit1: TEdit; //Сохранить и выйти Button1: TButton; //Решалка с-мы ду и построение графиков Button2: TButton; Chart1: TChart; Series1: TLineSeries; Chart2: TChart; Chart3: TChart; Chart4: TChart; Chart5: TChart; Series2: TLineSeries; Series3: TLineSeries; Series4: TLineSeries; Series5: TLineSeries; //Набор значений начальных условий StringGrid3: TStringGrid; Label2: TLabel; //Шаг интегрирования Edit2: TEdit; //Загрузить параметры движения по умолчанию Button3: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormActivate(Sender: TObject); procedure Button3Click(Sender: TObject); end; // // //Класс-граница TBorder = class (TFormBase) private /// True _Controller: TController; //Метод, обновляющий параметры движения на форме procedure UpdateParam; public //Метод, закрывающий и сохраняющий параметры движения из формы procedure SaveCloseButton; //Метод, решающий уравнения и отрисовывающий графики procedure SolveButton; //Метод, связывающий границу с контроллером procedure Connect(_Controller_: TController); //Метод, отрисовывающий графику procedure PlotGraph(f: array of double; series: TLineSeries); //Метод, выравнивающий элементы на форме(задает начальные положения) procedure FormActivate; //Метод, загружающий деолтне параметры движения procedure LoadDefaultParametres; end; // // // TController=class private //указатель на класс-границу /// True _Border: TBorder; //указатель на класс-хранилище /// True _Storage: TStorage; //возвращает значение функции угловой скорости для данного момента времени function w_t(w,alpha,V,H,teta: double):double; //возвращает значение функции угла атаки для данного момента времени function alpha_t(w,alpha,V,H,teta: double):double; //возвращает значение функции скорости для данного момента времени function V_t(w,alpha,V,H,teta: double):double; //возвращает значение функции высоты для данного момента времени function H_t(w,alpha,V,H,teta: double):double; //возвращает значение функции угла тангажа для данного момента времени function teta_t(w,alpha,V,H,teta: double):double; public //Значения соответствующих величин от времени w: array of double; alpha: array of double; V: array of double; H: array of double; teta: array of double; //Метод, соединяющий с границей и хранилищем procedure Connect(_Border_: TBorder; _Storage_: TStorage); //Метод, выполняющий операции при закрытии формы procedure Exit; //Метод, решающий с-му ду procedure Solve; //Метод, загружающий параметры движения из хранилища function GetParametresOfFly: TParametresOfFly; //Метод, устанавливающий параметры движения procedure SetParametresOfFly(p: TParametresOfFly); //Метод, загружающий параметры по умолчанию procedure LoadDefaultParametres; //Метод, инициализующий загрузку параметров из файла procedure LoadParamFromFile; end; // // //Класс-хранилище TStorage=class private //Указатель на класс-контроллер /// True _Controller: TController; //Метод, считающий коэффицинты движения линейной системы по параметрам режима полета procedure UpdateA; public //Хранилище параметров полета param: TParametresOfFly; //Конструктор =)) constructor Create; //Метод, соединяющий с контроллером procedure Connect(_Controller_: TController); //Метод, записывающий текущие параметра движения в файл procedure SaveParamToFile; //Метод, устанавливающий рабочие(текущие) параметры движения procedure SetParametresOfFly(p: TParametresOfFly); //Метод, получающий текущие параметры движения function GetParametresOfFly: TParametresOfFly; //Метод, устанавливающий параметры по умолчанию как текущие procedure SetDefaultParametres; //Метод, загружащий параметры из файла и устанавливающий их по умолчанию procedure LoadParamFromFile; end; var // FormBase: TFormBase; //Экземпляр класса-границы Border: TBorder; //Экземпляр класса-контроллера Controller: TController; //Экземпляр класса-хранилища Storage: TStorage; implementation {$R *.dfm} // // Методы класса интерфейса TFormBase // procedure TFormBase.Button1Click(Sender: TObject); begin Controller.Exit; end; procedure TFormBase.Button2Click(Sender: TObject); begin Border.SolveButton; end; procedure TFormBase.Button3Click(Sender: TObject); begin Border.LoadDefaultParametres; end; procedure TFormBase.FormActivate(Sender: TObject); begin Border.FormActivate; end; // // Методы класса интерфейса-границы TBorder // procedure TBorder.Connect(_Controller_: TController); begin _Controller:=_Controller_; end; procedure TBorder.SaveCloseButton; begin _Controller.Exit; end; procedure TBorder.SolveButton; var p: TParametresOfFly; i: integer; begin for i := 1 to 14 do p.c[i]:=StrToFloat(Border.StringGrid1.Cells[i-1,1]); for i := 1 to 3 do p.e[i]:=StrToFloat(Border.StringGrid2.Cells[i-1,1]); p.tt:=StrToFloat(Edit1.Text); p.h:=StrToFloat(Edit2.Text); p.w0:=StrToFloat(Border.StringGrid3.Cells[0,1]); p.alpha0:=StrToFloat(Border.StringGrid3.Cells[1,1]); p.V0:=StrToFloat(Border.StringGrid3.Cells[2,1]); p.H0:=StrToFloat(Border.StringGrid3.Cells[3,1]); p.teta0:=StrToFloat(Border.StringGrid3.Cells[4,1]); _Controller.SetParametresOfFly(p); _Controller.Solve; Series1.Clear; Series2.Clear; Series3.Clear; Series4.Clear; Series5.Clear; PlotGraph(Controller.w, Series1); PlotGraph(Controller.alpha, Series2); PlotGraph(Controller.V, Series3); PlotGraph(Controller.H, Series4); PlotGraph(Controller.teta, Series5); end; procedure TBorder.PlotGraph(f: array of double; series: TLineSeries); var i,l: integer; begin l:=High(f); for i := 0 to l do series.AddXY(Storage.param.h*i,f[i],'',clRed); end; procedure TBorder.UpdateParam; var i:integer; p: TParametresOfFly; begin p:=_Controller.GetParametresOfFly; for i := 1 to 14 do StringGrid1.Cells[i-1,1]:=FloatToStr(p.c[i]); for i := 1 to 3 do StringGrid2.Cells[i-1,1]:=FloatToStr(p.e[i]); StringGrid3.Cells[0,1]:=FloatToStr(p.w0); StringGrid3.Cells[1,1]:=FloatToStr(p.alpha0); StringGrid3.Cells[2,1]:=FloatToStr(p.V0); StringGrid3.Cells[3,1]:=FloatToStr(p.H0); StringGrid3.Cells[4,1]:=FloatToStr(p.teta0); Edit2.Text:=FloatToStr(p.h); Edit1.Text:=FloatToStr(p.tt); end; procedure TBorder.FormActivate; var i:integer; w:integer; begin _Controller.LoadParamFromFile; UpdateParam; StringGrid1.Width:=14*StringGrid1.DefaultColWidth+7*2; StringGrid1.Height:=2*StringGrid1.DefaultRowHeight; StringGrid2.Left:=14*StringGrid1.DefaultColWidth+170; StringGrid2.Width:=3*StringGrid2.DefaultColWidth+3*2; StringGrid2.Height:=2*StringGrid2.DefaultRowHeight; StringGrid3.Width:=5*StringGrid3.DefaultColWidth+5*2; StringGrid3.Height:=2*StringGrid3.DefaultRowHeight; for i:=1 to 14 do StringGrid1.Cells[i-1,0]:='c'+IntToStr(i); for i:=1 to 3 do StringGrid2.Cells[i-1,0]:='e'+IntToStr(i); StringGrid3.Cells[0,0]:='Wz0'; StringGrid3.Cells[1,0]:='Alpha0'; StringGrid3.Cells[2,0]:='V0'; StringGrid3.Cells[3,0]:='H0'; StringGrid3.Cells[4,0]:='Teta0'; w:=round((ClientWidth-60)/5); Border.Align:=alNone; Border.Height:=170+w; Chart1.Left:=10; Chart1.Height:=w; Chart1.Width:=w; Chart2.Left:=2*10+w; Chart2.Height:=w; Chart2.Width:=w; Chart3.Left:=3*10+2*w; Chart3.Height:=w; Chart3.Width:=w; Chart4.Left:=4*10+3*w; Chart4.Height:=w; Chart4.Width:=w; Chart5.Left:=5*10+4*w; Chart5.Height:=w; Chart5.Width:=w; end; procedure TBorder.LoadDefaultParametres; begin _Controller.LoadDefaultParametres; end; // // Методы класса контроллера TController // procedure TController.Connect(_Border_: TBorder; _Storage_: TStorage); begin _Border:=_Border_; _Storage:=_Storage_; end; // procedure TController.Exit; begin _Storage.SaveParamToFile; _Border.Close; end; function TController.w_t(w,alpha,V,H,teta: double):double; begin with _Storage.param do Result:=a[1,1]*w+a[1,2]*alpha+a[1,3]*V+a[1,4]*H+a[1,5]*teta; end; function TController.alpha_t(w,alpha,V,H,teta: double):double; begin with _Storage.param do Result:=a[2,1]*w+a[2,2]*alpha+a[2,3]*V+a[2,4]*H+a[2,5]*teta; end; function TController.V_t(w,alpha,V,H,teta: double):double; begin with _Storage.param do Result:=a[3,1]*w+a[3,2]*alpha+a[3,3]*V+a[4,4]*H+a[5,5]*teta; end; function TController.H_t(w,alpha,V,H,teta: double):double; begin with _Storage.param do Result:=a[4,1]*w+a[4,2]*alpha+a[4,3]*V+a[4,4]*H+a[4,5]*teta; end; function TController.teta_t(w,alpha,V,H,teta: double):double; begin with _Storage.param do Result:=a[5,1]*w+a[5,2]*alpha+a[5,3]*V+a[5,4]*H+a[5,5]*teta; end; procedure TController.Solve; var size,i: integer; begin size:=round(_Storage.param.tt/_Storage.param.h)+1; SetLength(w,size); SetLength(alpha,size); SetLength(V,size); SetLength(H,size); SetLength(teta,size); w[0]:=_Storage.param.w0; alpha[0]:=_Storage.param.alpha0; V[0]:=_Storage.param.V0; H[0]:=_Storage.param.H0; teta[0]:=_Storage.param.teta0; for i := 1 to size do begin w[i]:=w[i-1]+_Storage.param.h*w_t(alpha[i-1],w[i-1],V[i-1],H[i-1],teta[i-1]); alpha[i]:=alpha[i-1]+_Storage.param.h*alpha_t(alpha[i-1],w[i-1],V[i-1],H[i-1],teta[i-1]); V[i]:=V[i-1]+_Storage.param.h*V_t(alpha[i-1],w[i-1],V[i-1],H[i-1],teta[i-1]); H[i]:=H[i-1]+_Storage.param.h*H_t(alpha[i-1],w[i-1],V[i-1],H[i-1],teta[i-1]); teta[i]:=teta[i-1]+_Storage.param.h*teta_t(alpha[i-1],w[i-1],V[i-1],H[i-1],teta[i-1]); end; //end; end; // procedure TController.SetParametresOfFly(p: TParametresOfFly); begin _Storage.SetParametresOfFly(p); end; function TController.GetParametresOfFly: TParametresOfFly; begin Result:=_Storage.GetParametresOfFly; end; procedure TController.LoadDefaultParametres; begin _Storage.SetDefaultParametres; _Border.UpdateParam; end; procedure TController.LoadParamFromFile; begin _Storage.LoadParamFromFile; end; // // Методы класса хранилища TStorage // constructor TStorage.Create; begin SetDefaultParametres; end; procedure TStorage.Connect(_Controller_: TController); begin _Controller:=_Controller_; end; procedure TStorage.SetDefaultParametres; begin with param do begin c[1]:=0.5; c[2]:=15; c[3]:=2; c[4]:=1.21; c[5]:=0.204; c[6]:=1.4; c[7]:=0.17; c[8]:=0.1; c[9]:=0.15; c[10]:=0; c[11]:=0; c[12]:=0.985; c[13]:=0.4; c[14]:=0.31; e[1]:=0.023; e[2]:=0.1; e[3]:=0.05; w0:=0.5; alpha0:=0.2; V0:=0.3; H0:=0.4; teta0:=0.11; h:=0.05; tt:=5; end; UpdateA; end; procedure TStorage.SetParametresOfFly(p: TParametresOfFly); begin param:=p; UpdateA; end; function TStorage.GetParametresOfFly: TParametresOfFly; begin Result:=param; end; procedure TStorage.UpdateA; begin with param do begin a[1,1]:=-(c[1]+c[5]); a[1,2]:=-c[2]+c[4]*c[5]; a[1,3]:=c[5]*e[2]-e[3]; a[1,4]:=-c[3]+c[5]*c[9]; a[1,5]:=c[10]*c[5]; a[2,1]:=1; a[2,2]:=-c[4]; a[2,3]:=-e[2]; a[2,4]:=-c[9]; a[2,5]:=-c[10]; a[3,1]:=0; a[3,2]:=-c[8]; a[3,3]:=-e[1]; a[3,4]:=0; a[3,5]:=-c[7]; a[4,1]:=0; a[4,2]:=-c[6]; a[4,3]:=c[11]; a[4,4]:=0; a[4,5]:=c[6]; a[5,1]:=1; a[5,2]:=0; a[5,3]:=0; a[5,4]:=0; a[5,5]:=0; end; end; // procedure TStorage.SaveParamToFile; var f: file of TParametresOfFly; const f_name='config.txt'; begin AssignFile(f,f_name); ReWrite(f); Write(f,param); CloseFile(f); end; // procedure TStorage.LoadParamFromFile; var f: file of TParametresOfFly; const f_name='config.txt'; begin AssignFile(f,f_name); Reset(f); Read(f,param); CloseFile(f); end; end.